/**
 * 给定两个数组，三种操作：
 * 1. i x，将Ai改成x
 * 2. i x, 将Bi改成x
 * 3. s e, 对[s, e]区间做如下操作，令v=0
 *   然后 for i in [s, e]: v = max(v + Ai, v * Bi)
 * 保证操作3的结果小于1E18
 * 对每个操作3输出结果
 * 注意到题目保证结果小于1E18，说明B数组的大部分元素值都是1，
 * 最多只有64个不为1的值。因此可以用map保存这些不为1的元素值位置及其值。
 * 对每一个询问，之间的数肯定是求和，用树状数组即可。对于那64个不为1的位置，暴力即可。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

struct FenwickTree{ // 树状数组

using value_type = long long int;
using vec_type = vector<value_type>;

int n;
vec_type c;

FenwickTree() = default;

static int lowbit(int x){return x & -x;}

void init(int nn){this->c.assign((this->n=nn) + 1, 0);}

void modify(int pos, value_type delta){
    for(int i=pos;i<=this->n;i+=lowbit(i)) this->c[i] += delta;
}

value_type query(int pos)const{
    value_type ans = 0;
    for(int i=pos;i;i-=lowbit(i)) ans += this->c[i];
    return ans;
}

value_type query(int s, int e)const{return this->query(e) - this->query(s - 1);}

};

FenwickTree Bt;
int N, Q;
vll A;
vll B;
map<int, int> Map;

void work(){
    cin >> N;
    Bt.init(N);
    A.assign(N + 1, 0);
    for(int i=1;i<=N;++i){
        int x; cin >> x;
        Bt.modify(i, A[i] = x);
    }
    B.assign(N + 1, 0);
    for(int i=1;i<=N;++i) {
        cin >> B[i];
        if(B[i] != 1){
            Map[i] = B[i];
        }
    }
    cin >> Q;
    for(int q=1;q<=Q;++q){
        int cmd; cin >> cmd;
        if(1 == cmd){
            int p, x; cin >> p >> x;
            Bt.modify(p, x - A[p]);
            A[p] = x;
        }else if(2 == cmd){
            int p, x; cin >> p >> x;
            B[p] = x;
            if(B[p] != 1){
                Map[p] = B[p];
            }else{
                auto it = Map.find(p);
                if(it != Map.end()) Map.erase(it);
            }            
        }else if(3 == cmd){
            int a, b; cin >> a >> b;
            llt ans = A[a];
            auto ait = Map.lower_bound(a + 1);
            auto bit = Map.upper_bound(b);
            int cur = a + 1;
            for(auto it=ait;it!=bit;++it){
                if(cur < it->first){
                    ans += Bt.query(cur, it->first - 1);
                    cur = it->first;
                }
                 
                assert(cur == it->first); 
                if(ans + A[cur] < ans * B[cur]){
                    ans *= B[cur];
                }else{
                    ans += A[cur];
                }
                
                cur = it->first + 1;
            }

            if(cur <= b){
                ans += Bt.query(cur, b);
            }
            cout << ans << "\n";
        }else{
            assert(0);
        }
    }
    return; 
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}